package iso2.persistencia;

import iso2.dominio.Articulo;
import iso2.dominio.ArticuloInvalidoException;
import iso2.persistencia.Agente;
import iso2.persistencia.ConexionesOcupadasException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class FPArticulo
{
	public static void insertArticulo (Articulo articulo) throws SQLException,
		ConexionesOcupadasException
	{
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();

		// Insertar el nuevo artículo

		PreparedStatement sentencia = conexion.prepareStatement(
		"insert into articulo (nombre, precio, descripcion, categoria, imagen, cantidad, alta) values(?, ?, ?, ?, ?, ?, true);",
		Statement.RETURN_GENERATED_KEYS);
		
		sentencia.setString(1, articulo.getNombre());
		sentencia.setDouble(2, articulo.getPrecio());
		sentencia.setString(3, articulo.getDescripcion());
		sentencia.setString(4, articulo.getCategoria());
		sentencia.setString(5, articulo.getImagen());
		sentencia.setInt(6, articulo.getCantidad());
		sentencia.setBoolean(7, articulo.isAlta());
		
		sentencia.executeUpdate();
		ResultSet resultSet = sentencia.getGeneratedKeys();
	
		resultSet.next();
		int lastId = resultSet.getInt(1);
		agente.liberarConexion(conexion);
		articulo.setReferencia(lastId);
	}
	
	public static void modificarArticulo(Articulo articulo) throws SQLException, ConexionesOcupadasException
	{
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();
		
		PreparedStatement sentencia = conexion.prepareStatement(
				"update articulo set nombre = ?, precio = ?, descripcion = ?, categoria = ?, imagen = ?, cantidad = ?, alta = ? where referencia = ?");

		sentencia.setString(1, articulo.getNombre());
		sentencia.setDouble(2, articulo.getPrecio());
		sentencia.setString(3, articulo.getDescripcion());
		sentencia.setString(4, articulo.getCategoria());
		sentencia.setString(5, articulo.getImagen());
		sentencia.setInt(6, articulo.getCantidad());
		sentencia.setBoolean(7, articulo.isAlta());
		sentencia.setInt(8, articulo.getReferencia());
		
		sentencia.executeUpdate();
		
		agente.liberarConexion(conexion);
	}
	
	public static Articulo buscarArticulo(int referencia) throws SQLException,
		ConexionesOcupadasException, ArticuloInvalidoException
	{
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();
		
		// Buscar artículo en la base de datos
		
		PreparedStatement sentencia = conexion.prepareStatement(
				"select * from articulo where referencia = ?");
		sentencia.setInt(1, referencia);
		
		ResultSet resultado = sentencia.executeQuery();

		// El artículo no existe
		
		if (!resultado.next()) {
			agente.liberarConexion(conexion);
			throw new ArticuloInvalidoException();
		}
		
		Articulo articulo = new Articulo(referencia, resultado.getString("nombre"),
				resultado.getInt("precio"), resultado.getString("descripcion"), resultado.getString("categoria"),
				resultado.getString("imagen"), resultado.getInt("cantidad"), resultado.getBoolean("alta"));

		agente.liberarConexion(conexion);
		return articulo;
	}


	public static Articulo[] buscarArticulos(String categoria)
			throws SQLException, ConexionesOcupadasException
	{
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();
		ArrayList<Articulo> articulos = new ArrayList<Articulo>();
		
		// Buscar artículos en la base de datos
		
		PreparedStatement sentencia;
		
		if (categoria == "")
		{
			sentencia = conexion.prepareStatement("select * from articulo");
		} else
		{
			sentencia = conexion.prepareStatement("select * from articulo where categoria = ?");
			sentencia.setString(1, categoria);
		}
		
		ResultSet resultado = sentencia.executeQuery();
	
		while (resultado.next())
		{
			articulos.add(new Articulo(resultado.getInt("referencia"), resultado.getString("nombre"),
					resultado.getInt("precio"), resultado.getString("descripcion"),
					resultado.getString("categoria"), resultado.getString("imagen"),
					resultado.getInt("cantidad"), resultado.getBoolean("alta")));
		}
		
		agente.liberarConexion(conexion);
		
		Articulo [] r = new Articulo[articulos.size()]; 
		r = articulos.toArray(r);;
		return r;
	}
}